home *** CD-ROM | disk | FTP | other *** search
-
- { Return offset of MIDI key data in
- Track Event message, if present
- }
- function midi_key_offset(var eblk:track_event_block;
- chan:byte):integer;
- begin
- midi_key_offset:=ERR; { default return value }
- with eblk do
- begin
- if ((event_type in [MIDI, MIDI_RS])
- and (midi_cmnd(running_status)
- in [NOTE_OFF, NOTE_ON, AFTER_TOUCH_K])
- and (midi_chan(running_status) = chan)) then
- begin
- midi_key_offset:=1;
- if (event_type = MIDI_RS) then
- midi_key_offset:=2;
- end;
- end; { with eblk }
- end;
-
- { Return MIDI key data from Track Event, if present
- }
- function get_midi_key(var eblk:track_event_block;
- chan:byte):integer;
- var
- key_offset : integer;
- begin
- get_midi_key:=ERR; { default return value }
- key_offset:=midi_key_offset(eblk,chan);
- if (key_offset <> ERR) then
- get_midi_key:=eblk.event.mess[key_offset];
- end;
-
- { Set MIDI key value in a Track Event,
- if Track Event is of appropriate type
- }
- procedure set_midi_key(var eblk:track_event_block;
- chan,key:byte);
- var
- key_offset : integer;
- begin
- key_offset:=midi_key_offset(eblk,chan);
- if (key_offset <> ERR) then
- eblk.event.mess[key_offset]:=key;
- end;
-
- { Transpose all MIDI pitch (key) data
- for a channel in a Track Data block
- }
- procedure transpose_pitch(var tdi,tdo:track_data_block;
- chan,trans:integer);
- var
- curr_key : integer; { MIDI key value from
- current track event }
- begin
- reset_track_data(tdi);
- reset_track_data(tdo);
- while not(tdi.edat) do
- begin
- next_track_event(tdi);
- curr_key:=get_midi_key(tdi.curr,chan);
- if (curr_key <> ERR) then
- set_midi_key(tdi.curr,chan,
- midi_data_limit(curr_key+trans));
- store_track_event(tdo,tdi.curr);
- end;
- end;
-
- en
- set_midi_key(t